From 40eafaacb1ede52670b2efc9c9a28fd53f07382f Mon Sep 17 00:00:00 2001 From: "arun.sharma@intel.com[kaf24]" Date: Wed, 8 Jun 2005 08:40:39 +0000 Subject: [PATCH] bitkeeper revision 1.1691.1.4 (42a6af07Q4gVBgwNowk1mRBYhuAX_A) [PATCH] vmx-io-events.patch - Handle the case where the VMX domains get events from ports other than IOPACKET_PORT (because of paravirtualized drivers) - Use clear_bit() to operate on evtchn_upcall_pending Signed-off-by: Xiaofeng Ling Signed-off-by: Kevin Tian Signed-off-by: Arun Sharma --- xen/arch/x86/vmx_io.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/vmx_io.c b/xen/arch/x86/vmx_io.c index 95fa95aec8..240a327223 100644 --- a/xen/arch/x86/vmx_io.c +++ b/xen/arch/x86/vmx_io.c @@ -283,7 +283,7 @@ int vmx_clear_pending_io_event(struct vcpu *v) /* Note: VMX domains may need upcalls as well */ if (!v->vcpu_info->evtchn_pending_sel) - v->vcpu_info->evtchn_upcall_pending = 0; + clear_bit(0, &v->vcpu_info->evtchn_upcall_pending); /* clear the pending bit for IOPACKET_PORT */ return test_and_clear_bit(IOPACKET_PORT, @@ -311,10 +311,16 @@ void vmx_wait_io() extern void do_block(); do { - do_block(); + if(!test_bit(IOPACKET_PORT, + ¤t->domain->shared_info->evtchn_pending[0])) + do_block(); vmx_check_events(current); if (!test_bit(ARCH_VMX_IO_WAIT, ¤t->arch.arch_vmx.flags)) break; + /* Events other than IOPACKET_PORT might have woken us up. In that + case, safely go back to sleep. */ + clear_bit(IOPACKET_PORT>>5, ¤t->vcpu_info->evtchn_pending_sel); + clear_bit(0, ¤t->vcpu_info->evtchn_upcall_pending); } while(1); } -- 2.30.2